#ifndef __Lista_h__
#define __Lista_h__


/******************************************************************************/
/* Definicion de tipode de datos */
typedef enum 
{
LSC_PRIMERO,   //0
LSC_SIGUIENTE, //1
LSC_ANTERIOR   //2
} TMovimiento;

typedef struct TNodo
{
	void* Elem;
	struct TNodo *Siguiente;
} TNodo;

typedef struct
{
	TNodo *Primero, *Corriente;
	int TamanioDato;
} TLista;


/******************************************************************************/
/* Declaracion de primitivas */

/*
Pre: Ls no fue creada.
Post: Ls creada y vac�a */
void lista_Crear(TLista *pLs, int TamanioDato);

/* 
Pre: Ls creada.
Post: Ls vac�a.*/
void lista_Vaciar(TLista *pLs);

/* 
Pre: Ls creada.
Post: Si Ls tiene elementos devuelve FALSE sino TRUE.*/
int lista_Vacia(TLista Ls);

/* 
Pre: Ls creada y no vac�a.
Post: Se devuelve en E el elemento corriente de la lista.*/
void lista_ElemCorriente(TLista Ls, void* pE);

/* 
Pre: Ls creada y no vac�a.
Post: El contenido del elemento actual quedo actualizado con E. */
void lista_ModifCorriente(TLista *pLs, void* pE);

/* ls_MoverCorriente
Pre: Ls creada y no vac�a.
Post: Si Ls est� vac�a, devuelve FALSE. Sino:
Si M = LS_PRIMERO, el nuevo elemento corriente es el primero. Devuelve TRUE
Si M = LS_SIGUIENTE, el nuevo elemento corriente es el siguiente al
anterior. Si estaba en el �ltimo elemento, devuelve FALSE, sino TRUE.
Si M = LS_ANTERIOR, me muevo hacia atras, devuelve FALSE si ya estaba en el primero. */
int lista_MoverCorriente(TLista *pLs, TMovimiento M);

/*
Pre: Ls creada y no vac�a.
Post: Se elimin� el elemento corriente, El nuevo elemento es el siguiente o
el anterior si el corriente era el �ltimo elemento.*/
void lista_BorrarCorriente(TLista *pLs);

/* 
Pre: Ls creada.
Post: E se agreg� a la lista y es el actual elemento corriente.
Si M=LS_PRIMERO: se insert� como primero de la lista.
Si M=LS_SIGUIENTE: se insert� despu�s del elemento corriente.
Si M=LS_ANTERIOR: se insert� antes del elemento corriente.
Si pudo insertar el elemento devuelve TRUE, sino FALSE.*/
int lista_Insertar(TLista *pLs, TMovimiento M, void* E);

#endif
